perm filename MAP[F8,ALS] blob sn#306687 filedate 1977-09-29 generic text, type C, neo UTF8
COMMENT āŠ—   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	*MXP  Code to convert joystick reading into cursor position on board.
C00013 ENDMK
CāŠ—;
*MXP  Code to convert joystick reading into cursor position on board.
*Cursor's position on the board image is limited to the playing squares.
*When the joystick is moved the cursor jumps from playing square to
*playing square, always landing on that square that is nearest to the
*indicated joystick position.
*
*Interrogates  JOYI twice to get X and Y readings of joystick position.
*Returns byte in 3 (with one bit on for square) and byte number in 4 and
*moves cursor from old position on board image to new position.
*Uses reg 0, 1, 2, 3, 4, H, Q, and DC.
MXP	LR	K,P
	PI	PUSH
	LIS	H'01'	GET X
	LR	HU,A
	NOP
	NOP
	NOP
	NOP
	DI
	DCI	COM
	LI	H'65'
	ST
	DCI	CMRG
	ST
	LI	H'30'
	PI	WAIT
	PI	JOYI
	LR	0,A
	NOP
	NOP
	NOP
	NOP
	PI	MXPA
	LR	A,0
	LR	1,A
	CLR
	LR	HU,A
	NOP
	NOP
	NOP
	NOP
	PI	JOYI
	LR	0,A
	NOP
	NOP
	NOP
	NOP
*This code for compilers that accept  :  and .
	LI	INHR:		Set INT vector in SMI
	OUTS	H'C'
	LI	INHR.
*This code for compilers that do not accept : and .
*  DCI	INHR
*  LR	Q,DC
*  LR	A,QU
*  OUTS H'C'
*  LR	A,QL
*End of substitution
	OUTS	H'D'
	LIS	H'1'
	DCI	COM
	LI	BCMD
	ST
	DCI	CMRG
	ST
	EI
	NOP
	NOP
	NOP
	NOP
	PI	MXPA
	LR	A,0
	LR	2,A
	AS	1
	LR	3,A		Unnormalized sum in 3
	LIS	H'8'
	LR	0,A
	LR	A,3
MXP2	DS	0
	AI	H'F9'		Sub 7
	BP	MXP2
	LR	A,0
	LR	3,A		Sum into 3, range 0 thru 6
	LR	A,1
	COM
	AI	D'25'
	AS	2
	LR	4,A		Unnormalized difference in 4
	LIS	H'9'		Need 8 catagories for the difference
	LR	0,A
	LR	A,4
MXP3	DS	0
	AI	H'FD'		Sub 3
	BP	MXP3
	LR	A,0
	LR	4,A		Difference into 4, range 0 thru 7
	COM
	INC
	AS	3
	INC
	LR	1,A		Normalized X value
	LR	A,4
	AS	3
	INC
	SR	1
	LR	2,A		Normalized Y value
	SR	1
	LR	4,A		The byte number left in 4
	LR	A,1
	SR	1
	INC
	LR	3,A
	LIS	H'8'
	BR	MXP5
MXP4	SR	1
MXP5	DS	3
	BNZ	MXP4
	LR	A,1
	NI	H'1'
	BNZ	MXP6
	LR	A,3
	SR	4
	LR	3,A
MXP6	NOP			Byte with bit on left in 3
	LR	A,1
	SR	1
	LR	1,A
	LR	A,2
	NI	H'1'
	BZ	MXP7
	LR	A,1
	AI	H'4'
	LR	1,A		This is now the offset in the byte
MXP7	NOP
	DCI	JSAV
	LR	Q,DC
	CM
	BZ	MXPX		No change in position so exit
*Now we want to remove the old cursor and write the new
	PI	MXPS		Write new cursor
	DCI	JSAV
	LR	Q,DC
	LM
	LR	0,A
	LR	A,1
	LR	DC,Q
	ST			Save new value
	LR	A,0
	LR	1,A		Get ready to delete old cursor
	LR	Q,DC
	LM
	LR	0,A
	LR	A,4
	LR	DC,Q
	ST
	LR	A,0
	LR	4,A
	CI	H'07'
	BM	MXPX		No old cursor to remove
	PI	MXPS
MXPX	PI	POPS
	PK
*Subroutine to complement cursor (to remove old one or write new one)
MXPS	LR	K,P
	DCI	TAB1
	LR	A,4
	SL	1
	ADC
	LM
	LR	QU,A
	LM
	LR	QL,A
	LIS	H'4'
	LR	5,A
	DCI	TAB2
	LR	A,1
	ADC
	LM
	LR	DC,Q
	ADC
	XDC
	DCI	POIN
PUTP	LM
	XDC
	LR	Q,DC
	XM			Compliment POIN
	LR	DC,Q
	ST
	LIS	H'7'
	ADC
	XDC
	DS	5
	BP	PUTP
	PK
*
*Subroutine to reduce range and invert if necessary
MXPA	LR	K,P
	LR	A,0
	SR	1
	SR	1
	SR	1
	LR	0,A
	LR	A,7		Check color
	NS	7
	BNZ	MXPB		Do we need to invert?
	LR	A,0
	COM
	AI	D'25'
	LR	0,A
MXPB	PK
*
*
*
CURS    LR      K,P
        PI      PUSH
MAP2    PI      WAUD            WAIT,THEN DO UPDATE
        LIS     H'8'
MAP3    DCI     H'8FB'          DCO TO CURRENT Y LO
        CM
        BNZ     MAP3            TO START OF DISPLAY?
        LIS     H'1'            YES, WE CAN START JOYREAD
        LR      HU,A            SET FOR HORIZONTAL POT
        PI      JOYI            GET JOYSTICK INPUT
        LR      1,A             SAVE IN REGISTER 1
        LIS     H'0'
        LR      HU,A            SET FOR VERTICAL POT
        PI      JOYI            AND READ SAME
        LR      0,A             SAVING READING IN REG 0
        PI      AMAP            NOW CONVERT VERTICAL READING
        LR      A,1             GET HORIZONTAL READING
        LR      0,A             SET IT FOR CONVERSION
        LR      A,2             GET LAST VALUE
        LR      1,A             AND SAVE VERT. CONV. IN R1
        PI      AMAP            NOW CONVERT HORIZONTAL READING
        LR      A,2             RECOVER CONVERTED HORIZONTAL
        AS      1               ADD IN VERTICAL
        NI      H'1'            MASK
        BNZ     MAP5            IF SUM EVEN, NOT ON LEGIT SQ
        DS      2               NOT LEGIT,SO DEC X POSIT.
        BP      MAP5            CLICKS BACK?
        LIS     H'1'            YES, SO INCREMENT
        LR      2,A             X COORD.
MAP5    LR      A,1             LEGIT. GET VERTICAL
        SL      4               MULT BY 16
        AS      2               ADD IN HORIZONTAL
        LR      0,A             AND SAVE IN REG 0
        DCI     JSAV      DCO TO LAST JOYSTICK RECORD
        CM                COMPARE IT WITH CURRENT
        BNZ     MAP4      IF DIFFERENT, SHOW NEW POSIT
        CLR               SAME READING
        OUTS    1
        NOP               NOPS FOR FCC
        NOP
        NOP
        INS     1
        NI      H'1'      STRIP TO DESIRED BIT
        BZ      MAP2      BUTTON PRESSED?
        LR      A,0       RECOVER JOYSTICK READING
        ST                AND SAVE IN JSAV+1
        JMP     WAU1      WAIT, UPDATE, AND RETURN
MAP4    PI      MVC       DIFFERENT--SO REMOVE OLD CURSOR
        DCI     JSAV
        LR      A,0       GET N READING
        ST                RESET STORE VALUE
        PI      MVC       TURN ON NEW POSITION
        BR      MAP2      AND GO BACK FOR MORE
******************************
*SET CURSOR (OR REMOVE IT)   *
******************************
*USED:  ACC, Q, DCO, DC1, R1 *
******************************
MVC     LR      K,P       SAVE RETURN ADDRESS
        DCI     JSAV      DCO TO JOYSTICK READ
        LM                RECOVER IT
        LR      1,A       AND SAVE TEMPORARILY IN R1
        DCI     TABL      DCO TO JOYTABLE
        SR      4
        SL      1         STRIPO 2 X(YCOORD)
        ADC               ADD OFFSET FOR Y COORD
        LM                GET HIGH ORDER
        LR      QU,A      SAVE IN QU
        LM                GET LOWER
        LR      QL,A      AND SAVE IN QLOWER
        LR      DC,Q      LOAD IN TO DCO
        LIS     H'F'
        NS      1         STRIP TO X COORD
        ADC               ADD IN APPROPRIATELY
        XDC               NOW SAVE DESTINATION
        LIS     H'4'
        LR      1,A       SET COUNTER
        DCI     POIN      DCO TO CURSOR
MVC1    LM                GET CURSOR BYTE
        XDC               SAVE ADDRESS, & RECOVER DEST
        LR      Q,DC      SAVE DEST ADDR
        XM                OR IN (OR XOR OUT)
        LR      DC,Q      RECOVER ADDRESS OF DEST.
        ST                RESET
        LIS     H'7'      OFFSET TO NEXT DEST
        ADC       ?       ADD IT IN
        XDC               RECOVER SOURCE ADDR.
        DS      1         DECREMENT COUNTER
        BNZ     MVC1      DONE?
        PK                YES, RETURN